package com.sh.data.engine.repository.dao.datadev.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.sh.data.engine.repository.dao.base.EngineBaseModel;
import com.sh.data.engine.repository.dao.datadev.entity.OfflineDevSyncTask.PartitionField;
import lombok.*;

import java.util.Date;
import java.util.List;

@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Data
@TableName("tb_datadev_offline_sync")
public class DatadevOfflineSyncEntity extends EngineBaseModel<DatadevOfflineSyncEntity> {

    private Long nodeId;
    /**
     * 任务名称
     */
    private String taskName;

    /**
     * 任务描述
     */
    private String remark;

    /**
     * 来源数据源类型
     */
    private String sourceDsType;

    /**
     * 来源数据源id
     */
    private Long sourceDsId;

    /**
     * 目标数据源类型
     */
    private String targetDsType;

    /**
     * 目标数据源id
     */
    private Long targetDsId;


    /**
     * 是否有分区 0-否 1-有
     */
    private Integer isParition;

    /**
     * 是否是富文本 0-否 1-有
     */
    private Integer isSupportText;

    /**
     * 替换规则 1-写入前清理已有数据 Insert Overwrite 2-写入前保留已有数据 Insert Into 3-同名覆盖 4-同名忽略 5-主键冲突，替换原有数据
     * 6-主键冲突，丢弃新数据 7-key值相同，覆盖 8-key值相同，忽略
     */
    private Integer dataReplaceRuleId;

    /**
     * 同步前是否清理 1-是 0-否
     */
    private Integer isTruncate;

    /**
     * 失败记录数超过多少时，任务结束,值为-1时表示不限制
     */
    private Integer errorNumLimit;

    /**
     * 是否是增量 0-否 1-是
     */
    private Integer isInc;

    /**
     * 过滤条件
     */
    private String incFilter;

    /**
     * 0-全部 1-待发布 2-运行中 3-成功 4-失败
     */
    private Date startTime;

    private Date endTime;

    /**
     * 来源表
     */
    private String sourceTable;

    /**
     * 目标表
     */
    private String targetTable;

    /**
     * 分区信息
     */
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private List<PartitionField> paritions;

    /**
     * 每次读取数据条数
     */
    private Integer fetchSize;

    /**
     * 每次写入数据条数
     */
    private Integer batchSize;

    /**
     * 并发数
     */
    private Integer channel;

    /**
     * 切片字段
     */
    private String splitKey;

    private Integer pgText;

    @Data
    @Builder(toBuilder = true)
    public static class FieldMapping {

        /*来源字段名*/
        private String sourceField;

        /*来源字段类型*/
        private String sourceFieldType;

        /*来源字段是否是主键*/
        private Integer isSourceFieldPk;

        /*目标字段名*/
        private String targetField;

        /*目标字段类型*/
        private String targetFieldType;

        /*目标字段是否是主键*/
        private Integer isTargetFieldPk;

        /*目标字段长度*/
        private Integer targetColumnSize;

        /*目标字段小数位长度*/
        private Integer targetDecimalDigits;

        /*目标字段备注*/
        private String targetComment;

        /*日期编码格式*/
        private String dateFormat;
    }
}
